﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.IO;
using FastReport;

namespace Kiosk
{
    public partial class frmMusteri : Form
    {

        List<PuanTanim> tanimlar = new List<PuanTanim>();
        bool tanimlarYuklendi = false;

        public frmMusteri()
        {
            InitializeComponent();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            txtKartNo.Focus();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtKartNo.Text))
            {
                this.Close();
            }
        }

        private void frmMusteri_Load(object sender, EventArgs e)
        {
            try
            {
                frmMain own = this.Owner as frmMain;
                own.MusteriGorAktif = true;

                using (PromoEntities ent = new PromoEntities())
                {
                    if (!tanimlarYuklendi)
                    {
                        tanimlar = ent.PuanTanimlari.Where(x => x.BaslangicTarihi <= DateTime.Now && x.BitisTarihi >= DateTime.Now && x.No < 99).ToList();
                        tanimlarYuklendi = true;
                    }
                }
                txtKartNo.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Bilgisayar Bağlantısı Koptu ! Lütfen Sistem Yöneticisine Başvurunuz !\r\n" + ex.Message);
            }
        }

        private void frmMusteri_FormClosed(object sender, FormClosedEventArgs e)
        {
            frmMain own = this.Owner as frmMain;
            own.MusteriGorAktif = false;
        }

        private void txtKartNo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                lbl1.Visible = true;
                lbl2.Visible = true;
                lbl3.Visible = true;
                lbl4.Visible = true;
                lblCariAdi.Visible = true;
                lblKartNo.Visible = true;
                lblPuan.Visible = true;
                pictureEdit1.Visible = false;
                label1.Visible = false;
                txtHarcama.Visible = true;
                lbl5.Visible = true;
                lblTlKarsiligi.Visible = true;
                simpleButton1.Visible = true;
                simpleButton2.Visible = true;
                simpleButton3.Visible = true;
                simpleButton4.Visible = true;
                simpleButton5.Visible = true;
                simpleButton6.Visible = true;
                simpleButton7.Visible = true;
                simpleButton8.Visible = true;
                simpleButton9.Visible = true;
                simpleButton10.Visible = true;
                simpleButton11.Visible = true;
                simpleButton12.Visible = true;
                txtKartNo.Text = txtKartNo.Text.Replace("ş", "").Replace(":", "");
                MusteriBul();
            }
        }

        private PuanTanim AktifTanim(string cariKodu)
        {
            //11*-12*-25*=38*
            //CARI.DAT’ DA KAYITLI OLAN VE CARIKODU 11 VE 12 İLE 
            //BAŞLAYAN VEYA CARIKODLARININ BAŞLANGICI 25 DEN BÜYÜK 
            //EŞİT VE 38DEN  KÜÇÜK EŞİT OLANLAR

            PuanTanim tanim = null;
            foreach (var item in tanimlar)
            {
                if (item.MusteriAraligi == "")
                {
                    tanim = item;
                    break;
                }
                else
                {
                    if (item.MusteriAraligi == cariKodu) //tek cari için tanımlanmışsa
                    {
                        tanim = item;
                        break;
                    }
                    else //filtre uygulanmışsa
                    {
                        string[] filtreler = item.MusteriAraligi.Split('-');
                        if (filtreler.Length > 0)
                        {
                            foreach (string filtre in filtreler)
                            {
                                if (filtre.IndexOf('=') > -1)
                                {
                                    string[] tmp1 = filtre.Replace("=", "").Split('*');
                                    int c1 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[0].Length));
                                    int c2 = Cevir.Parse<int>(cariKodu.Mid(0, tmp1[1].Length));
                                    if (c1 >= Cevir.Parse<int>(tmp1[0]) && c2 <= Cevir.Parse<int>(tmp1[1]))
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                                else if (filtre.IndexOf('*') > -1)
                                {
                                    string tmp2 = filtre.Replace("*", "");
                                    if (cariKodu.Mid(0, tmp2.Length) == tmp2)
                                    {
                                        tanim = item;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return tanim;
        }

        private void TLKarsiligiHesapla(string carikod)
        {
            PuanTanim tanim = AktifTanim(carikod);
            if (tanim != null)
            {
                lblTlKarsiligi.Text = (double.Parse(lblPuan.Text) / tanim.AlisverisPuani * tanim.PuanParaKarsiligi).ToString("n2");
            }
        }

        private void MusteriBul()
        {
            using (PromoEntities ent = new PromoEntities())
            {
                var cari = ent.Cariler.Where(x => x.Kodu == txtKartNo.Text).FirstOrDefault();
                if (cari != null)
                {
                    lblCariAdi.Text = cari.Adi;
                    lblKartNo.Text = cari.Kodu;

                    var puan = ent.BonusPuanlar.Where(x => x.Cari_Kod == cari.Kodu).FirstOrDefault();
                    if (puan != null)
                    {
                        if (puan.Puan.HasValue)
                            lblPuan.Text = puan.Puan.Value.ToString("n2");

                        if (puan.ToplamTutar.HasValue)
                            lblTlKarsiligi.Text = puan.ToplamTutar.Value.ToString("n2");

                        if (puan.Puan > 0)
                            txtHarcama.Focus(); //eğer yeterli puan varsa gönder

                        TLKarsiligiHesapla(cari.Kodu);
                    }
                    txtKartNo.Text = "";
                }
                else
                {
                    lblCariAdi.Text = "Müşteri Bulunamadı !";
                }
            }
        }

        private void ButtonClick(object sender, EventArgs e)
        {
            SimpleButton btn = sender as SimpleButton;
            txtHarcama.Text += btn.Text;
        }

        private void simpleButton11_Click(object sender, EventArgs e)
        {
            try
            {
                MusteriBul();

                decimal mevcutTl = -1;
                if (!string.IsNullOrEmpty(lblTlKarsiligi.Text))
                    mevcutTl = decimal.Parse(lblTlKarsiligi.Text);

                decimal kullanilacakTL = 0;
                if (!string.IsNullOrEmpty(txtHarcama.Text))
                    kullanilacakTL = decimal.Parse(txtHarcama.Text);

                if (!string.IsNullOrEmpty(lblCariAdi.Text) && kullanilacakTL > 0 && kullanilacakTL <= mevcutTl)
                {
                    simpleButton11.Enabled = false;
                    PrintCek();
                }
                else
                {
                    MessageBox.Show("Yeterli puan yok !");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Bilgisayar Bağlantısı Koptu ! Lütfen Sistem Yöneticisine Başvurunuz !\r\n" + ex.Message);
            }
        }

        private string CekNoOlustur()
        {
            using (PromoEntities ent = new PromoEntities())
            {
                string rnd = new Random().Next(1, 999999999).ToString("000000000");
                if (ent.IndirimCekleri.Where(x => x.Cek_No == rnd).Count() > 0)
                {
                    return CekNoOlustur();
                }
                else
                    return rnd + "000" + CalculateChecksumDigit(rnd + "000");
            }
        }

        private int CalculateChecksumDigit(string barkod)
        {
            string sTemp = barkod;
            int iSum = 0;
            int iDigit = 0;
            for (int i = sTemp.Length; i >= 1; i--)
            {
                iDigit = Convert.ToInt32(sTemp.Substring(i - 1, 1));
                if (i % 2 == 0)
                {
                    iSum += iDigit * 3;
                }
                else
                {
                    iSum += iDigit * 1;
                }
            }

            int iCheckSum = (10 - (iSum % 10)) % 10;
            return iCheckSum;
        }

        private decimal PuanKarsiligiHesapla(string carikod)
        {
            PuanTanim tanim = AktifTanim(carikod);
            if (tanim != null)
            {
                return (decimal)(double.Parse(txtHarcama.Text) / tanim.PuanParaKarsiligi * tanim.AlisverisPuani);
            }
            return 0;
        }

        private void CekEvrakKayit(PrintDesing doc)
        {
            PuanTanim tanim = AktifTanim(doc.MusteriKodu);
            if (tanim != null)
            {
                using (PromoEntities ent = new PromoEntities())
                {
                    IndirimCek cek = new IndirimCek();
                    cek.Cek_No = doc.CekKodu;
                    cek.Baslangic = tanim.BaslangicTarihi;
                    cek.Bitis = tanim.BitisTarihi;
                    cek.Cari_Kod = doc.MusteriKodu;
                    cek.Puan = PuanKarsiligiHesapla(doc.MusteriKodu);
                    cek.Tutar = decimal.Parse(txtHarcama.Text);
                    ent.AddToIndirimCekleri(cek);
                    ent.SaveChanges();
                }
            }
        }

        private void PrintCek()
        {
            string fileName = Application.StartupPath + "\\CekDizayn.dsx";
            if (File.Exists(fileName))
            {
                //data oluşturma kısmı
                PrintDesing cekEvrak = new PrintDesing();
                cekEvrak.BaslangicTarihi = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                cekEvrak.BitisTarihi = cekEvrak.BaslangicTarihi.AddDays(10);
                cekEvrak.CekKodu = CekNoOlustur();
                cekEvrak.MusteriKodu = lblKartNo.Text;
                cekEvrak.MusteriUnvani = lblCariAdi.Text;
                cekEvrak.Tutar = decimal.Parse(txtHarcama.Text);
                //cekEvrak.SubeKodu = Program.Session[ Settings.;
                CekEvrakKayit(cekEvrak);
                //***************

                Report report = Report.FromFile(fileName);
                report.RegisterData(new System.Windows.Forms.BindingSource { DataSource = cekEvrak }, "Document", 1);
                report.GetDataSource("Document").Enabled = true;
                report.PrintSettings.Printer = Program.Session[Settings.CekPrinter].ToString();
                report.PrintSettings.ShowDialog = false;
                report.Prepare();
                report.Print();
            }
            this.Close();
        }

        private void simpleButton12_Click(object sender, EventArgs e)
        {
            txtHarcama.Text = "";
        }

    }
}
